﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Tecnopez.Globals;
using BussinessLogicTecnoPez;
using BussinessLogicTecnoPez.Produccion.FaenamientoEnvasado;
using BussinessLogicTecnoPez.Produccion.Enfermedades_y_control_de_estanques;

public partial class Modules_FaenamientoEnvasado_ABMAsignaciones : System.Web.UI.Page
{
    private const string _VIEW_STATE_MODIFY = "VIEW_STATE_MODIFY";
    private bool isValidDate;

    protected void Page_Load(object sender, EventArgs e)
    {
        _lblError.Text = "";

        if (IsPostBack == false)
        {
            SetMode(PageMode.ListMode);
            ViewState[_VIEW_STATE_MODIFY] = "";
            TPCFechaHasta.Visible = false;
            txtHoraHasta.Visible = false;
        }
        else
        {
            PageMode objMode=this.getMode();
            if (objMode == PageMode.NewMode || objMode == PageMode.EditMode)
            {
                if (ViewState[_VIEW_STATE_MODIFY].ToString() == string.Empty)
                    CalcularFechaHasta();
            }
        }

        InicializarGrilla();
        TPPTarea.ObjType = typeof(Tarea);
        TPPEmpleado.ObjType = typeof(Empleado);
        TPPBuscarTarea.ObjType = typeof(Tarea);
        TPPBuscarEmpleado.ObjType = typeof(Empleado);

        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/kdmconfig.png";
        master.Titulo = "Gestión de Asignaciones";
        cargarGrilla();
       
        
    }
    private void CalcularFechaHasta()
    {
        if (TPCFechaDesde.Text.Trim() == string.Empty || txtHoraDesde.Text.Trim() == string.Empty)
            return;

        Tarea objTarea = TPPTarea.ItemSelected as Tarea;
        if (objTarea != null)
        {
            try
            {
                DateTime objFechaHasta;
                objFechaHasta = Asignacion.GetFechaFin(Asignacion.ConcatenarFechaHora(Convert.ToDateTime(TPCFechaDesde.Text), txtHoraDesde.Text), objTarea.Duracion);
                TPCFechaHasta.Text = objFechaHasta.ToShortDateString();
                txtHoraHasta.Text = objFechaHasta.ToShortTimeString();
                lblFechaHastaData.Text = objFechaHasta.ToShortDateString();
                lblHoraHastaData.Text = objFechaHasta.ToShortTimeString();

                isValidDate = true;
            }
            catch (Exception ex)
            {
                isValidDate = false;
                TPCFechaHasta.Text = "";
                txtHoraHasta.Text = "";
                lblFechaHastaData.Text = "";
                lblHoraHastaData.Text = "";
                _lblError.Text = ex.Message;
            }
        }
    }
    private void InicializarGrilla()
    {
        DataControlField[] controlesExtra = new DataControlField[2];
        ButtonField b = new ButtonField();
        b.CommandName = "Realizacion";
        b.HeaderText = "Realización";
        b.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/mini_tool.png";
        b.ButtonType = ButtonType.Image;

        controlesExtra[0] = b;

        b = new ButtonField();
        b.CommandName = "ver";
        b.HeaderText = "Editar";
        b.ImageUrl = Functions.getHost(this.Page) + "Styles/Icons/lupa.png";
        b.ButtonType = ButtonType.Image;        

        controlesExtra[1] = b;
        grdAsignaciones.setupGrid(typeof(Asignacion), cargarGrilla, true, true, this.ViewState, controlesExtra);
    }
    private void SetMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        switch (mode)
        {
            case PageMode.ListMode:
                mvABM.ActiveViewIndex = 0;
                break;
            case PageMode.NewMode:
                mvABM.ActiveViewIndex = 1;
                txtCodigo.ReadOnly = true;
                TPPEmpleado.Enable = true;
                TPPTarea.Enable = true;
                TPCFechaDesde.Enabled = true;
                txtHoraDesde.ReadOnly = false;
                TPCFechaHasta.Enabled = true;
                txtHoraHasta.ReadOnly = false;
                txtObservaciones.ReadOnly = false;
                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;
                cmdCalcular.Visible = true;
                cmdEditarFin.Visible = true;
                cmdEditarFin.Text = "Modificar";
                ViewState[_VIEW_STATE_MODIFY] = "";
                break;
            case PageMode.EditMode:
                mvABM.ActiveViewIndex = 1;
                txtCodigo.ReadOnly = true;
                TPPEmpleado.Enable = true;
                TPPTarea.Enable = true;
                TPCFechaDesde.Enabled = true;
                txtHoraDesde.ReadOnly = false;
                TPCFechaHasta.Enabled = true;
                txtHoraHasta.ReadOnly = false;
                txtObservaciones.ReadOnly = false;
                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;
                cmdCalcular.Visible = true;
                cmdEditarFin.Visible = true;
                cmdEditarFin.Text = "Modificar";
                ViewState[_VIEW_STATE_MODIFY] = "";
                break;
            case PageMode.ViewMode:
                mvABM.ActiveViewIndex = 1;
                txtCodigo.ReadOnly = true;
                TPPEmpleado.Enable = true;
                TPPTarea.Enable = false;
                TPCFechaDesde.Enabled = false;
                txtHoraDesde.ReadOnly = true;
                TPCFechaHasta.Enabled = false;
                txtHoraHasta.ReadOnly = true;
                txtObservaciones.ReadOnly = true;
                cmdAceptar.Visible = false;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = true;
                cmdEliminar.Enabled = true;
                cmdCalcular.Visible = false;
                cmdEditarFin.Visible = false;
                cmdEditarFin.Text = "Modificar";
                ViewState[_VIEW_STATE_MODIFY] = "";
                break;
        }

    }

    private void cargarGrilla()
    {
        Asignacion.getManager.ClearFilters();
        Asignacion.getManager.ClearOrders();
        Asignacion.getManager.AddFilter("IDAsignacion", GenericManager<Asignacion>.filterOperator.Like, "%" + txtBuscarCodigo.Text.Trim() + "%");
        Asignacion.getManager.AddFilter("Empleado", GenericManager<Asignacion>.filterOperator.Distinct, null);

        if (TPPBuscarEmpleado.ItemSelected != null)
        {
            Empleado objEmpleado = TPPBuscarEmpleado.ItemSelected as Empleado;
            Asignacion.getManager.AddFilter("EMPLEADO", GenericManager<Asignacion>.filterOperator.Equals, objEmpleado.IdEmpleado);
        }
        if (TPPBuscarTarea.ItemSelected != null)
        {
            Tarea objTarea = TPPBuscarTarea.ItemSelected as Tarea;
            Asignacion.getManager.AddFilter("Tarea", GenericManager<Asignacion>.filterOperator.Equals, objTarea.IdTarea);
        }

        if (ViewState[grdAsignaciones.PageDataViewOrderKey] == null)
            Asignacion.getManager.AddOrder("IdAsignacion", GenericManager<Asignacion>.Order.orderDirection.DESC);
        else
            Asignacion.getManager.AddOrder(ViewState[grdAsignaciones.PageDataViewOrderKey].ToString(), (GenericManager<Asignacion>.Order.orderDirection)ViewState[grdAsignaciones.PageDataViewOrdenDireccionKey]);

        List<Asignacion> lista = new List<Asignacion>();
        lista = Asignacion.getManager.GetFilter();
        grdAsignaciones.DataSource = lista;
        grdAsignaciones.DataBind();
    }
    private PageMode getMode()
    {
        if (ViewState["PageMode"] == null)
            return PageMode.ModeNotFound;
        return (PageMode)ViewState["PageMode"];
    }
    protected void grdAsignaciones_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (grdAsignaciones.Rows[0].Cells[0].Text == "&nbsp;")
        {
            return;
        }

        if (e.CommandName == "ver")
        {
            int IdAsignacion = int.Parse(grdAsignaciones.DataKeys[System.Convert.ToInt32(e.CommandArgument)].Value.ToString());
            Asignacion.getManager.ClearFilters();
            Asignacion.getManager.AddFilter("IdAsignacion", GenericManager<Asignacion>.filterOperator.Equals, IdAsignacion);
            Asignacion objAsignacion = Asignacion.getManager.GetOne();

            txtCodigo.Text = objAsignacion.IdAsignacion.ToString();
            TPPEmpleado.ItemSelected = objAsignacion.Empleado;
            TPPTarea.ItemSelected = objAsignacion.Tarea;
            txtObservaciones.Text = objAsignacion.Observaciones;

            TPCFechaDesde.Text = objAsignacion.FechaDesde.ToShortDateString();
            txtHoraDesde.Text = objAsignacion.FechaDesde.ToShortTimeString();

            TPCFechaHasta.Text = objAsignacion.FechaHasta.ToShortDateString();
            txtHoraHasta.Text = objAsignacion.FechaHasta.ToShortTimeString();

            lblFechaHastaData.Text = objAsignacion.FechaHasta.ToShortDateString();
            lblHoraHastaData.Text = objAsignacion.FechaHasta.ToShortTimeString();

            SetMode(PageMode.ViewMode);
            if (objAsignacion.IncluidaEnPlan)
            {
                cmdEditar.OnClientClick = "alert('Esta asignación pertenece a un plan de faenamiento. Para editar esta asignación debe editar el correspondiente plan.'); return false;";
                cmdEliminar.OnClientClick = "alert('Esta asignación pertenece a un plan de faenamiento. Para eliminar esta asignación debe editar el correspondiente plan.'); return false;";
            }
            else
            {
                cmdEditar.OnClientClick = "";
                cmdEliminar.OnClientClick = "return confirm('Esta seguro de eliminar el registro?');";
            }
        }
        if (e.CommandName == "Realizacion")
        {

        }
    }
    protected void cmdNuevo_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.NewMode);
        txtCodigo.Text = "";
        txtObservaciones.Text = "";
        TPPEmpleado.ItemSelected = null;
        TPPTarea.ItemSelected = null;
        TPCFechaDesde.Text = "";
        TPCFechaHasta.Text = "";
        txtHoraDesde.Text = "";
        txtHoraHasta.Text = "";
        lblFechaHastaData.Text = "";
        lblHoraHastaData.Text = "";
        TPCFechaHasta.Visible = false;
        txtHoraHasta.Visible = false;
    }
    protected void cmdEditar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.EditMode);
    }
    protected void cmdEliminar_Click(object sender, EventArgs e)
    {
        try
        {
            Asignacion objAsignacion = Asignacion.getManager.GetOneByPrimaryKey(Convert.ToInt32(txtCodigo.Text));

            if (Asignacion.getManager.Delete(objAsignacion) <= 0)
                throw Asignacion.getManager.GeneratedException;

            SetMode(PageMode.ListMode);
            this.cargarGrilla();
        }
        catch (Exception ex)
        {
            _lblError.Text = ex.Message;
        }
    }
    protected void cmdAceptar_Click(object sender, EventArgs e)
    {
        try
        {
            if (!isValidDate)
            {
                _lblError.Text = "Las fechas asignadas no son correctas.";
                return;
            }

            Asignacion objAsignacion = new Asignacion();

            objAsignacion.Empleado = TPPEmpleado.ItemSelected as Empleado;
            objAsignacion.Tarea = TPPTarea.ItemSelected as Tarea;
            objAsignacion.Observaciones = txtObservaciones.Text;

            objAsignacion.FechaDesde = Asignacion.ConcatenarFechaHora(Convert.ToDateTime(TPCFechaDesde.Text), txtHoraDesde.Text);
            objAsignacion.FechaHasta = Asignacion.ConcatenarFechaHora(Convert.ToDateTime(TPCFechaHasta.Text), txtHoraHasta.Text);

            if (objAsignacion.FechaDesde >= objAsignacion.FechaHasta)
            {
                _lblError.Text = "La fecha desde no puede superar a la fecha hasta.";
                return;
            }            

            DateTime datFechaLibre;
            
            if (getMode() == PageMode.NewMode)
            {
                if (!objAsignacion.VerificarFechas(out datFechaLibre))
                {
                    _lblError.Text = "El empleado ya posee asignaciones en las fechas indicadas. \n El empleado se encuentra libre a partir del " + datFechaLibre.ToShortDateString() + " a las " + datFechaLibre.ToShortTimeString();
                    return;
                }
                if (Asignacion.getManager.Insert(objAsignacion) != true)
                {
                    throw Asignacion.getManager.GeneratedException;
                }
                SetMode(PageMode.ListMode);
                cargarGrilla();
            }
            else
            {
                objAsignacion.IdAsignacion = int.Parse(txtCodigo.Text.Trim());
                if (!objAsignacion.VerificarFechasUpdate(out datFechaLibre))
                {
                    _lblError.Text = "El empleado ya posee asignaciones en las fechas indicadas. \n El empleado se encuentra libre a partir de " + datFechaLibre.ToShortDateString() + " a las " + datFechaLibre.ToShortTimeString();
                    return;
                }
                if (Asignacion.getManager.Update(objAsignacion) != true)
                {
                    throw Asignacion.getManager.GeneratedException;
                }
                SetMode(PageMode.ViewMode);
            }
        }
        catch (Exception exc)
        {
            _lblError.Text = "error: No se pudo realizar la operación " + exc.Message;
            Functions.LogError(exc);
        }
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.ListMode);
    }
    protected void cmdEditarFin_Click(object sender, EventArgs e)
    {
        if (TPCFechaHasta.Visible)
        {
            TPCFechaHasta.Visible = false;
            txtHoraHasta.Visible = false;
            lblFechaHastaData.Visible = true;
            lblHoraHastaData.Visible = true;

            cmdEditarFin.Text = "Modificar";

            rfvFechaHasta.Enabled = false;
            rfvHoraHasta.Enabled = false;

            ViewState[_VIEW_STATE_MODIFY] = "";

            cmdCalcular.Visible = true;
        }
        else
        {
            TPCFechaHasta.Visible = true;
            txtHoraHasta.Visible = true;
            lblFechaHastaData.Visible = false;
            lblHoraHastaData.Visible = false;

            cmdEditarFin.Text = "Por defecto";
            rfvFechaHasta.Enabled = true;
            rfvHoraHasta.Enabled = true;

            ViewState[_VIEW_STATE_MODIFY] = "Modifica";

            cmdCalcular.Visible = false;
        }
    }
}
